<?php


namespace Trawind\Remotes;



use Trawind\Basics\Traits\GuzzleHttpClient;
use Prettus\Repository\Contracts\closure;
use Prettus\Repository\Contracts\RepositoryInterface;
use Prettus\Repository\Contracts\ValidatorException;

/**
 * Class BaseRepository
 *
 * @method paginateOrAll(bool $skipPresenter = false, ?int $limit = null, $columns = ['*'])
 * @method skipFind($id, bool $skipPresenter = false, $columns = ['*'])
 * @method skipCreate(array $attributes, bool $skipPresenter = false)
 * @method skipUpdate(array $attributes, $id, bool $skipPresenter = false)
 * @method getListById(array $ids, bool $isColumnData = true)
 * @method batchUpdateStatus(array $ids, int $status_type_id)
 * @method batchDelete(array $ids)
 * @package Trawind\Remotes
 */
abstract class BaseRepository implements RepositoryInterface
{

    use GuzzleHttpClient,RemoteEnhance;


    /**
     * @param string $column
     * @param string|null $key
     * @return mixed
     */
    public function lists($column, $key = null)
    {
        // TODO: Implement lists() method.
    }

    /**
     * @param string $column
     * @param string|null $key
     * @return mixed
     */
    public function pluck($column, $key = null)
    {
        // TODO: Implement pluck() method.
    }

    /**
     * @param $id
     * @param $relation
     * @param $attributes
     * @param bool $detaching
     * @return mixed
     */
    public function sync($id, $relation, $attributes, $detaching = true)
    {
        // TODO: Implement sync() method.
    }

    /**
     * @param $id
     * @param $relation
     * @param $attributes
     * @return mixed
     */
    public function syncWithoutDetaching($id, $relation, $attributes)
    {
        // TODO: Implement syncWithoutDetaching() method.
    }

    /**
     * @param array|string[] $columns
     * @return mixed
     */
    abstract public function all($columns = ['*']);

    /**
     * @param null $limit
     * @param array|string[] $columns
     * @return mixed
     */
    public function paginate($limit = null, $columns = ['*'])
    {
        // TODO: Implement paginate() method.
    }

    /**
     * @param null $limit
     * @param array|string[] $columns
     * @return mixed
     */
    public function simplePaginate($limit = null, $columns = ['*'])
    {
        // TODO: Implement simplePaginate() method.
    }

    /**
     * @param $id
     * @param array|string[] $columns
     * @return mixed
     */
    abstract public function find($id, $columns = ['*']);

    /**
     * @param $field
     * @param $value
     * @param array|string[] $columns
     * @return mixed
     */
    public function findByField($field, $value, $columns = ['*'])
    {
        // TODO: Implement findByField() method.
    }

    /**
     * @param array $where
     * @param array|string[] $columns
     * @return mixed
     */
    public function findWhere(array $where, $columns = ['*'])
    {
        // TODO: Implement findWhere() method.
    }

    /**
     * @param $field
     * @param array $values
     * @param array|string[] $columns
     * @return mixed
     */
    public function findWhereIn($field, array $values, $columns = ['*'])
    {
        // TODO: Implement findWhereIn() method.
    }

    /**
     * @param $field
     * @param array $values
     * @param array|string[] $columns
     * @return mixed
     */
    public function findWhereNotIn($field, array $values, $columns = ['*'])
    {
        // TODO: Implement findWhereNotIn() method.
    }

    /**
     * @param $field
     * @param array $values
     * @param array|string[] $columns
     * @return mixed
     */
    public function findWhereBetween($field, array $values, $columns = ['*'])
    {
        // TODO: Implement findWhereBetween() method.
    }

    /**
     * @param array $attributes
     * @return mixed
     */
    abstract public function create(array $attributes);

    /**
     * @param array $attributes
     * @param $id
     * @return mixed
     */
    abstract public function update(array $attributes, $id);

    /**
     * @param array $attributes
     * @param array $values
     * @return mixed
     */
    public function updateOrCreate(array $attributes, array $values = [])
    {
        // TODO: Implement updateOrCreate() method.
    }

    /**
     * @param $id
     * @return mixed
     */
    public function delete($id)
    {
        // TODO: Implement delete() method.
    }

    /**
     * @param string $column
     * @param string $direction
     * @return mixed
     */
    public function orderBy($column, $direction = 'asc')
    {
        // TODO: Implement orderBy() method.
    }

    /**
     * @param $relations
     * @return mixed
     */
    public function with($relations)
    {
        // TODO: Implement with() method.
    }

    /**
     * @param string $relation
     * @param closure $closure
     * @return mixed
     */
    public function whereHas($relation, $closure)
    {
        // TODO: Implement whereHas() method.
    }

    /**
     * @param mixed $relations
     * @return mixed
     */
    public function withCount($relations)
    {
        // TODO: Implement withCount() method.
    }

    /**
     * @param array $fields
     * @return mixed
     */
    public function hidden(array $fields)
    {
        // TODO: Implement hidden() method.
    }

    /**
     * @param array $fields
     * @return mixed
     */
    public function visible(array $fields)
    {
        // TODO: Implement visible() method.
    }

    /**
     * @param \Closure $scope
     * @return mixed
     */
    public function scopeQuery(\Closure $scope)
    {
        // TODO: Implement scopeQuery() method.
    }

    /**
     * @return mixed
     */
    public function resetScope()
    {
        // TODO: Implement resetScope() method.
    }

    /**
     * @return mixed
     */
    public function getFieldsSearchable()
    {
        // TODO: Implement getFieldsSearchable() method.
    }

    /**
     * @param $presenter
     * @return mixed
     */
    public function setPresenter($presenter)
    {
        // TODO: Implement setPresenter() method.
    }

    /**
     * @param bool $status
     * @return mixed
     */
    public function skipPresenter($status = true)
    {
        // TODO: Implement skipPresenter() method.
    }

    /**
     * @param array $attributes
     * @return mixed
     */
    public function firstOrNew(array $attributes = [])
    {
        // TODO: Implement firstOrNew() method.
    }

    /**
     * @param array $attributes
     * @return mixed
     */
    public function firstOrCreate(array $attributes = [])
    {
        // TODO: Implement firstOrCreate() method.
    }

    /**
     * @param $method
     * @param $arguments
     * @return mixed
     */
    public static function __callStatic($method, $arguments)
    {
        // TODO: Implement __callStatic() method.
    }

    /**
     * @param string $method
     * @param array $arguments
     * @return mixed
     */
    public function __call($method, $arguments)
    {
        // TODO: Implement __call() method.
    }

}
